/*
 * Gerade.h
 *
 *  Created on: Feb 14, 2011
 *      Author: alki
 */

#ifndef GERADE_H_
#define GERADE_H_

#include "Vektor.h"
#include "Ebene.h"
#include <stdlib.h>

/**
 * gibt die Steigung in den verschiedenen Achs-Richtungen an
 */
enum CLASSIFICATION
{ MMM, MMP, MPM, MPP, PMM, PMP, PPM, PPP, POO, MOO, OPO, OMO, OOP, OOM,	OMM,OMP,OPM,OPP,MOM,MOP,POM,POP,MMO,MPO,PMO,PPO};

/**
 * Klasse Gerade: Repräsentiert eine Gerade im IR^3
 */
class Gerade {
public:
	Gerade();
	virtual ~Gerade();

	void setPos(Vektor pos) { this->m_pos=pos; }
	void setDir(Vektor dir) { this->m_dir=dir; }
	Vektor getPos() const { return this->m_pos; }
	Vektor getDir() const { return this->m_dir; }

	/**
	 * Überprüft, ob die Gerade eine Ebene (bzw. Dreieck) schneidet
	 */
	bool Intersects_E(const Ebene &e,Vektor *S=NULL,float *r=NULL,float *s=NULL) const;

	/**
	 * Für die schnelle Berechnung der Kollision mit einer Box
	 */
	void CalcHelpers();

protected:
	Vektor m_pos;
	Vektor m_dir;

	/**
	 * Für die schnelle Berechnung der Kollision mit einer Box
	 */
public:
	CLASSIFICATION m_class;
	float i, j, k;
	float ii, ij, ik;
	int classification;
	float ibyj, jbyi, kbyj, jbyk, ibyk, kbyi;
	float c_xy, c_xz, c_yx, c_yz, c_zx, c_zy;
};

#endif /* GERADE_H_ */
